//package com.bruce.codeFactory.Thread.ThreadPool;
//
//import java.util.ArrayList;
//import java.util.LinkedList;
//import java.util.List;
//
///**
// * @author luotuan
// * @Description
// * @create 2019-02-21 15:35
// **/
//public class MyThreadPoolDemo {
//    private final int size;
//    private final static int DEFAULT_SIZE = 10;
//    private final int queueSize;
//    private final static int DEFAULT_QUEUE_SIZE = 100;
//    private final static String THREAD_FEFIX = "MY_THREAD_POOL-";
//    private final static ThreadGroup GROUP = new ThreadGroup("POOL_GROUP");
//    private volatile int seq = 0;
//    private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
//    private final static List<WokerTask> THREAD_QUEUE = new ArrayList<>();
//    //默认拒绝策略
//    private final static RejectPolicy DEFAULT_REJECT_POLICY = () -> {
//        throw new RejectException("Reject....");
//    };
//    private final RejectPolicy rejectPolicy;
//    private volatile boolean destory = false;
//
//    public MyThreadPoolDemo() {
//        this(DEFAULT_SIZE, DEFAULT_QUEUE_SIZE, DEFAULT_REJECT_POLICY);
//    }
//
//    public MyThreadPoolDemo(int size, int queueSize, RejectPolicy rejectPolicy) {
//        this.size = size;
//        this.queueSize = queueSize;
//        this.rejectPolicy = rejectPolicy;
//        init();
//    }
//
//    private void init() {
//        for (int i = 0; i < size; i++) {
//            createWokerThread();
//        }
//    }
//
//    private void createWokerThread() {
//        WokerTask task = new WokerTask(GROUP, THREAD_FEFIX + (seq++));
//        task.start();
//        THREAD_QUEUE.add(task);
//    }
//
//    public void shutdown() throws InterruptedException {
//        if (!TASK_QUEUE.isEmpty()) {
//            Thread.sleep(50);
//        }
//        int size = THREAD_QUEUE.size();
//        while (size > 0) {
//            for (WokerTask wokerTask : THREAD_QUEUE) {
//                if (wokerTask.getTaskState() == TaskState.BLOCKED) {
//                    wokerTask.interrupt();
//                    wokerTask.close();
//                    size--;
//                } else {
//                    Thread.sleep(10);
//                }
//            }
//        }
//        this.destory = true;
//        System.out.println("The thread pool disposed.");
//    }
//
//    public void submit(Runnable runnable) {
//        if (destory) {
//            throw new IllegalStateException("The thread pool already destory and not allow submit task");
//        }
//        synchronized (TASK_QUEUE) {
//            if (TASK_QUEUE.size() > queueSize) {
//                rejectPolicy.reject();
//            }
//            TASK_QUEUE.addLast(runnable);
//            TASK_QUEUE.notifyAll();
//        }
//    }
//
//    public int getSize() {
//        return size;
//    }
//
//    public int getQueueSize() {
//        return queueSize;
//    }
//
//    private enum TaskState {
//        FREE, RUNNING, BLOCKED, DEAD
//    }
//
//    private static class RejectException extends RuntimeException {
//        public RejectException(String message) {
//            super(message);
//        }
//    }
//
//    private interface RejectPolicy {
//        void reject() throws RejectException;
//    }
//
//
//    private class WokerTask extends Thread {
//        private volatile TaskState taskState = TaskState.FREE;
//
//        public WokerTask(ThreadGroup group, String name) {
//            super(group, name);
//        }
//
//        public TaskState getTaskState() {
//            return this.taskState;
//        }
//
//        @Override
//        public void run() {
//            OUTER:
//            while (this.taskState != TaskState.DEAD) {
//                Runnable runnable;
//                synchronized (TASK_QUEUE) {
//                    while (TASK_QUEUE.isEmpty()) {
//                        try {
//                            taskState = TaskState.BLOCKED;
//                            TASK_QUEUE.wait();
//                        } catch (InterruptedException e) {
//                            break OUTER;
//                        }
//                    }
//                    runnable = TASK_QUEUE.removeFirst();
//                }
//                if (runnable != null) {
//                    taskState = TaskState.RUNNING;
//                    runnable.run();
//                    taskState = TaskState.FREE;
//                }
//            }
//        }
//
//        public void close() {
//            this.taskState = TaskState.DEAD;
//        }
//    }
//}
